package com.example.consumptionrecords.util.date;

import com.example.consumptionrecords.entity.enums.Month;
import com.example.consumptionrecords.entity.enums.TwelveAnimals;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * SunJingxuan
 * 2022 \ 08 \ 15
 */

public class DateUtil {

	private static final String PATTEN_DEFAULT_YYYY_MM_DD = "yyyy-MM-dd";


	private static final String PATTEN_DEFAULT_MM_DD = "MM月dd日";

	private static final String PATTEN_DEFAULT_MM_DD1 = "MM-dd";

	private static final String PATTEN_DEFAULT_MM = "MM";

	private static final String PATTEN_DEFAULT_YYYY = "yyyy";

	private static final SimpleDateFormat SDF_YYYY_MM_DD = new SimpleDateFormat(PATTEN_DEFAULT_YYYY_MM_DD);

	private static final SimpleDateFormat SDF_YYYY = new SimpleDateFormat(PATTEN_DEFAULT_YYYY);

	private static final SimpleDateFormat SDF_MM_DD = new SimpleDateFormat(PATTEN_DEFAULT_MM_DD);

	private static final SimpleDateFormat SDF_MM = new SimpleDateFormat(PATTEN_DEFAULT_MM);

	private static final Integer RAT_YEAR = 2020;

	private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR);

	private static final int MONTH = Calendar.getInstance().get(Calendar.MONTH) + 1;

	private static final int DAY = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);

	private static final int MONTH_FIRST_DAY = Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);

	private static final int MONTH_LAST_DAY = Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

	/**
	 * 判断日期是否是今天
	 * @param date 字符串日期（yyyy-MM-dd）
	 * @return true or false
	 */
	public static Boolean isToday(String date) {
		String nowString = SDF_YYYY_MM_DD.format(new Date());
		return date.equals(nowString);
	}

	/**
	 * 判断日期是否是今天
	 * @param date Date类日期
	 * @return true or false
	 */
	public static Boolean isToday(Date date) {
		return isToday(SDF_YYYY_MM_DD.format(date));
	}

	/**
	 * 判断日期是否是昨天
	 * @param date 字符串日期（yyyy-MM-dd）
	 * @return true or false
	 */
	public static Boolean isYesterday(String date) {
		String yesterdayString = SDF_YYYY_MM_DD.format(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000));
		return date.equals(yesterdayString);
	}

	/**
	 * 判断日期是否是今天
	 * @param date Date类日期
	 * @return true or false
	 */
	public static Boolean isYesterday(Date date) {
		return isYesterday(SDF_YYYY_MM_DD.format(date));
	}

	/**
	 * 判断日期是否是年
	 * @param date 字符串日期（yyyy-MM-dd）
	 * @return true or false
	 */
	public static Boolean isThisYear(String date) {
		String thisYear = SDF_YYYY.format(new Date());
		return date.split("-")[0].equals(thisYear);
	}

	/**
	 * 判断日期是否是年
	 * @param date Date类日期
	 * @return true or false
	 */
	public static Boolean isThisYear(Date date) {
		return isThisYear(SDF_YYYY.format(date));
	}

	/**
	 * 年月日转换成月日（yyyy-MM-dd -> mm月dd日）
	 * @param date 字符串日期（yyyy-MM-dd）
	 * @return 字符串日期（mm月dd日）
	 * @throws ParseException
	 */
	public static String yearMonthDayToMonthDay(String date) throws ParseException {
		Date paramDate = SDF_YYYY_MM_DD.parse(date);
		return SDF_MM_DD.format(paramDate);
	}

	/**
	 * 获取当天是第几号
	 * @return 数字
	 */
	public static Integer getDayOfMonth() {
		return DAY;
	}

	/**
	 * 获取本月
	 * @return 字符串
	 */
	public static String getMonth() {
		return Month.match(MONTH);
	}

	public static int getYear() {
		return YEAR;
	}

	/**
	 * 获取生肖
	 * @return 生肖字符串
	 */
	public static String getThisYearAnimals() {
		return TwelveAnimals.match((YEAR - RAT_YEAR) % 12);
	}

	/**
	 * 判断今天是春分(3月21日)、夏至(6月21日)、秋分(9月21日)、冬至(12月21日) 那一天
	 * @return 字符串
	 */
	public static String getSeasons() {
		switch (MONTH) {
			case 1:
			case 2:
				return "winter";
			case 3:
				return DAY >= 21 ? "spring" : "winter";
			case 4:
			case 5:
				return "spring";
			case 6:
				return DAY >= 21 ? "spring" : "summer";
			case 7:
			case 8:
				return "summer";
			case 9:
				return DAY >= 21 ? "summer" : "autumn";
			case 10:
			case 11:
				return "autumn";
			case 12:
				return DAY >= 21 ? "autumn" : "winter";
		}
		return null;
	}

	/**
	 * 判断今天是1、春分(3月21日)、2、夏至(6月21日)、3、秋分(9月21日)、4、冬至(12月21日) 那一天
	 * @return 字符串
	 */
	public static int getSeasonsInt() {
		switch (MONTH) {
			case 1, 2 -> {
				return 4;
			}
			case 3 -> {
				return DAY >= 21 ? 1 : 4;
			}
			case 4, 5 -> {
				return 1;
			}
			case 6 -> {
				return DAY >= 21 ? 2 : 1;
			}
			case 7, 8 -> {
				return 2;
			}
			case 9 -> {
				return DAY >= 21 ? 3 : 2;
			}
			case 10, 11 -> {
				return 3;
			}
			case 12 -> {
				return DAY >= 21 ? 4 : 3;
			}
		}
		return -1;
	}

	public static String getDayStart() {
		return YEAR + "-" + MONTH + "-" + DAY;
	}

	public static String getDayEnd() {
		return YEAR + "-" + MONTH + "-" + DAY;
	}

	public static String getMonthFirstDay() {
		return YEAR + "-" + MONTH + "-" + MONTH_FIRST_DAY;
	}

	public static String getMonthLastDay() {
		return YEAR + "-" + MONTH + "-" + MONTH_LAST_DAY;
	}

	public static void main(String[] args) throws ParseException {
		System.out.println(getThisYearAnimals());
		System.out.println(getSeasonsInt());
	}
}
